package com.wfbi.security.chapter24.service;

import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PostFilter;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.access.prepost.PreFilter;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @author wfbi
 * @version 1.0
 * @date 2022/1/5 5:03 PM
 */
@Service
public class HelloService {
    /**
     * 注解的约束是，只有当前登录用户名为 wfbi 的用户才可以访问该方法
     *
     * @author: wfbi
     * @date: 2022/1/5 5:09 PM
     * @return: java.lang.String
     **/
    @PreAuthorize("principal.username.equals('wfbi')")
    public String hello() {
        return "hello";
    }

    /**
     * 访问该方法的用户必须具备 admin 角色
     *
     * @author: wfbi
     * @date: 2022/1/5 5:09 PM
     * @return: java.lang.String
     **/
    @PreAuthorize("hasRole('admin')")
    public String admin() {
        return "admin";
    }

    /**
     * 该方法的用户必须具备 user 角色，但是注意 user 角色需要加上 ROLE_ 前缀
     *
     * @author: wfbi
     * @date: 2022/1/5 5:10 PM
     * @return: java.lang.String
     **/
    @Secured({"ROLE_user"})
    public String user() {
        return "user";
    }


    /**
     * 该方法的 age 参数必须大于 98，否则请求不予通过
     *
     * @param age:
     * @author: wfbi
     * @date: 2022/1/5 5:10 PM
     * @return: java.lang.String
     **/
    @PreAuthorize("#age>98")
    public String getAge(Integer age) {
        return String.valueOf(age);
    }

    /**
     * 使用过滤注解:
     * <p>
     * 集合进行过滤，只返回后缀为 2 的元素，filterObject 表示要过滤的元素对象
     *
     * @author: wfbi
     * @date: 2022/1/5 5:11 PM
     * @return: java.util.List<java.lang.String>
     **/
    @PostFilter("filterObject.lastIndexOf('2')!=-1")
    public List<String> getAllUser() {
        List<String> users = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            users.add("javaboy:" + i);
        }
        return users;
    }

    /**
     * 使用过滤注解:
     * 由于有两个集合，因此使用 filterTarget 指定过滤对象
     *
     * @param ages:
     * @param users:
     * @author: wfbi
     * @date: 2022/1/5 5:11 PM
     * @return: void
     **/
    @PreFilter(filterTarget = "ages", value = "filterObject%2==0")
    public void getAllAge(List<Integer> ages, List<String> users) {
        System.out.println("ages = " + ages);
        System.out.println("users = " + users);
    }
}